#include<iostream>
#include<cstdio>
#define N 100000
#define mod 1000000007
using namespace std;
const int inv2=(mod+1)>>1;
int read()
{
	char c=0;
	int sum=0;
	while (c<'0'||c>'9') c=getchar();
	while ('0'<=c&&c<='9') sum=sum*10+c-'0',c=getchar();
	return sum;
}
int fast_pow(int a,int b)
{
	int res=1,mul=a;
	while (b)
	{
		if (b&1) res=1ll*res*mul%mod;
		mul=1ll*mul*mul%mod,b>>=1;
	}
	return res;
}
int MD(int x)
{
	return x>=mod?x-mod:x;
}
int MD2(int x)
{
	return x<0?x+mod:x;
}
void Adder(int &x,int d)
{
	x=x+d>=mod?x+d-mod:x+d;
	return;
}
void Adder2(int &x,int d)
{
	x=x+d<0?x+d+mod:x+d;
	return;
}
struct matrix
{
	int d[2][2];
};
matrix zero,rst,rst2,e={1,0,0,1},c;
int n,m,x,ans,pw[N+1];
matrix operator * (matrix a,matrix b)
{
	c=zero;
	for (int k=0;k<=1;++k)
		for (int i=0;i<=1;++i)
			if (a.d[i][k])
				for (int j=0;j<=1;++j)
					if (b.d[k][j])
						Adder(c.d[i][j],1ll*a.d[i][k]*b.d[k][j]%mod);
	return c;
}
matrix fast_pows(matrix a,int b)
{
	matrix res=e,mul=a;
	while (b)
	{
		if (b&1) res=res*mul;
		mul=mul*mul,b>>=1;
	}
	return res;
}
int main()
{
	freopen("pearl.in","r",stdin);
	freopen("pearl.out","w",stdout);
	string y;
	bool op=1;
	pw[0]=1;
	for (int i=1;i<=N;++i) pw[i]=2ll*pw[i-1]%mod;
	n=read(),m=read(),x=read(),cin>>y;
	for (int i=1;i<=m;++i)
	{
		op&=(y[i-1]=='0');
		rst=fast_pows((matrix){1,pw[i]-1,1,mod-1},x-1);
		rst2=fast_pows((matrix){1,pw[i]-1,1,mod-1},n-x);
		Adder(ans,1ll*MD2(fast_pow(pw[i],n-1)-1ll*MD(rst.d[!op][0]+rst.d[!op][1])*MD(rst2.d[!op][0]+rst2.d[!op][1])%mod)*pw[i-1]%mod*inv2%mod*fast_pow(pw[m-i],n-1)%mod);
	}
	printf("%d\n",ans);
	return 0;
}
